#include <boost/asio.hpp>
#include <iostream>
#include <memory>

using boost::asio::ip::tcp;


int main()
{
    // 输入输出上下文
    boost::asio::io_context ioc;
    // tcp套接字      
    boost::asio::ip::tcp::socket sock(ioc);    

    // 定时器同步操作
    boost::asio::steady_timer t1(ioc, boost::asio::chrono::seconds(5));
    t1.wait();
    std::cout << "t1 Hello, world!" << std::endl;

    //定时器异步操作
    /*  程序启动
        ↓
        创建 io_context （无事件）
        ↓
        构造 steady_timer，设置 5 秒后到期 （状态：等待中）
        ↓
        t.async_wait(&print) 注册回调 （状态：等待中）
        ↓
        io.run() 阻塞并进入事件循环
        ↓
        （0 ~ 5 秒内，io.run() 阻塞在底层 epoll_wait，定时器等待到期）
        ↓
        约 5 秒后，底层定时器到期 → epoll 通知 → Asio 完成队列插入 “定时器就绪” 事件
        ↓
        io.run() 从队列取出事件，调用 print 回调
        ↓
        print 打印 “Hello, world!”
        ↓
        回调结束，io.run() 检查没有剩余异步操作，返回
        ↓
        main 返回，进程退出

        */
    boost::asio::steady_timer t2(ioc, boost::asio::chrono::seconds(1));
    t2.async_wait([](const boost::system::error_code& ec)
    {
        std::cout << "t2 Hello, world!" << std::endl;
    });

    boost::asio::steady_timer t3(ioc, boost::asio::chrono::seconds(5));
    int count = 0;
    std::function<void(const boost::system::error_code&)> handler = [&](const boost::system::error_code& ec)
    {
        if (count < 5){
            std::cout <<count<<"s"<< std::endl;
            count++;
            // 已有定时器到期的基础上推迟 1 秒，再次异步等待
            t2.expires_after(boost::asio::chrono::seconds(1));
            t2.async_wait(handler);
        }   
    };
    // 第一次注册
    t2.async_wait(handler);
    ioc.run();
    
}